package cn.bookcycle.requestroom.util;

import java.util.HashMap;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.bookcycle.requestroom.ConstantData.DBConstant;
import cn.bookcycle.requestroom.pojo.RoomBase;
import cn.bookcycle.requestroom.pojo.UserBase;
import cn.bookcycle.requestroom.pojo.UserInfo;

/**
 * 调用数据库微服务业务工具类
 *
 * @author liufenglin
 * @date 2018年3月4日
 */
public class DaoUtil {
	private static final Logger logger = LoggerFactory.getLogger(DaoUtil.class);

	/**
	 * 通过房间ID查询房间信息
	 * 
	 * @param roomId
	 * @return
	 * @throws JSONException
	 */
	public static String getRoomById(String roomId) throws JSONException {
		// 存放各种数据库微服务查询参数的JOSNObject
		JSONObject jsonObject = new JSONObject();
		// 指定数据库
		jsonObject.put(DBConstant.DB_NAME, DBConstant.ROOM_DB);
		// 指定表名
		jsonObject.put(DBConstant.TAB_NAME, DBConstant.ROOM_TAB);
		// 指定查询操作
		jsonObject.put(DBConstant.METHOD, DBConstant.FIND);

		// 将房间ID信息封装到一个subJsonObject中
		JSONObject subJsonObject = new JSONObject();
		// 拼接信息到subJsonObject中
		subJsonObject.put(DBConstant.ID, roomId);
		// subJsonObject放到jsonObject中
		jsonObject.put(DBConstant.DATA, subJsonObject);
		// 把jsonObject转换成json串
		String data = jsonObject.toString();
		logger.warn("根据房间ID查询时，发送的json格式请求参数是:{}", data);
		// 向数据库微服务发送请求
		String result = DBUtil.sendPost(DBConstant.DB_URI, DBConstant.DATA, data, DBConstant.UTF8);
		logger.info("通过房间ID:{},获取到的房间信息:{}", roomId, result);
		return result;
	}

	/**
	 * 通过用户Id 查询用户已经使用的免费看房次数
	 * 
	 * @param userId
	 * @return
	 */
	public static String getUsedFreeChanceById(String userId) {
		// 存放各种数据库微服务查询参数的map
		Map<String, Object> map = new HashMap<String, Object>();
		// 存放各user参数的map
		Map<String, Object> userMap = new HashMap<String, Object>();
		// 指定数据库的名字
		map.put(DBConstant.DB_NAME, DBConstant.USER_ROOM_DB);
		// 指定表名
		map.put(DBConstant.TAB_NAME, DBConstant.FREE_CHANCE_TAB);
		// 指定查询操作
		map.put(DBConstant.METHOD, DBConstant.FIND);
		// 拼接信息到map中
		userMap.put(DBConstant.ID, userId);
		// UserBase user = new UserBase();
		// user.setUserId(userId);
		map.put(DBConstant.USER, userMap);
		logger.info("拼接好后的map是:{}", map);
		// 将map转换成json串
		String data = new JSONObject(map).toString();
		logger.info("传送的data是:{}", data);
		String result = DBUtil.sendPost(DBConstant.DB_URI, DBConstant.DATA, data, DBConstant.UTF8);
		logger.info("通过userId:{},获取到的user信息:{}", userId, result);
		try {
			JSONArray jsonArray = new JSONArray(result);
		} catch (JSONException e) {
			// 如果result没有取到jsonArray数据，返回null，来提醒用户
			result = null;
		}
		return result;
	}

	/**
	 * 修改指定用户的免费看房次数
	 *
	 * @param userId
	 * @return
	 */
	public static String updateFreeChance(UserInfo user) {
		logger.info("修改用户的免费看房次数");
		String result = "";
		// 各种参数组成的map
		Map<String, Object> map = new HashMap<String, Object>();
		// 由用户参数构成的map
		Map<String, Object> userMap = new HashMap<String, Object>();
		// 指定数据库名
		map.put(DBConstant.DB_NAME, DBConstant.USER_ROOM_DB);
		// 指定表名
		map.put(DBConstant.TAB_NAME, DBConstant.FREE_CHANCE_TAB);
		// 指定update方法
		map.put(DBConstant.METHOD, DBConstant.UPDATE);
		// 放入用户相关参数
		userMap.put(DBConstant.ID, user.getUserId());
		userMap.put(DBConstant.FREE_COUNT, user.getUsedFreeCount() + 1);
		// 把user参数装入map
		map.put(DBConstant.USER, userMap);
		// 向数据库微服务发送请求
		result = DBUtil.sendPost(DBConstant.DB_URI, DBConstant.DATA, new JSONObject(map).toString(), DBConstant.UTF8);
		logger.info("修改数据库中用户的免费看房次数后，返回的信息:{}", result);
		return result;
	}

	/**
	 * 根据房间的json格式数据，修改数据库中对应的status信息
	 * 
	 * @param roomJson
	 *            房间的JSON格式数据
	 * @param status
	 *            status属性的值
	 * @return
	 * @throws JSONException
	 */
	public static String updateRoomStatus(String roomJson, boolean status) throws JSONException {
		// 解析roomJson为subJsonObject
		JSONObject subjsonObject = new JSONObject(roomJson);
		// 移除status字段
		subjsonObject.remove(DBConstant.STATUS);
		// 添加status属性和值
		subjsonObject.put(DBConstant.STATUS, status);
		// 把subJsonObject转为字符串数据
		String data = subjsonObject.toString();
		// 新建一个jsonObject
		JSONObject jsonObject = new JSONObject();
		// 指定数据库名
		jsonObject.put(DBConstant.DB_NAME, DBConstant.ROOM_DB);
		// 指定表名
		jsonObject.put(DBConstant.TAB_NAME, DBConstant.ROOM_TAB);
		// 指定更新方法
		jsonObject.put(DBConstant.METHOD, DBConstant.UPDATE);
		// 把subJsonObject放入jsonObject
		jsonObject.put(DBConstant.DATA, subjsonObject);
		logger.info("发情修改房间状态信息请求的数据是:{}", jsonObject.toString());
		// 向数据库微服务发送请求，修改指定房间的status属性为false，表示房间已满
		String result = DBUtil.sendPost(DBConstant.DB_URI, DBConstant.DATA, jsonObject.toString(), DBConstant.UTF8);
		// 返回请求结果
		return result;
	}

	/**
	 * 通过用户ID获取他所有的看房授权记录(按时间来对记录排序)
	 * 
	 * @param userId
	 *            用户ID
	 * @return 返回JSONArray格式字符串
	 */
	public static String getCheckAuthorizationById(String userId) {
		// 新建一个jsonObjec用于封装请求参数为json格式
		JSONObject jsonObject = new JSONObject();
		// 新建一个subJsonObject用于存放查找条件
		JSONObject subJsonObject = new JSONObject();
		try {
			// 指定数据库名
			jsonObject.put(DBConstant.DB_NAME, DBConstant.USER_ROOM_DB);
			// 指定表名
			jsonObject.put(DBConstant.TAB_NAME, DBConstant.CHECK_AUTHORIZATION_TAB);
			// 指定查找方法
			jsonObject.put(DBConstant.METHOD, DBConstant.FIND);
			// 指定data字段作为排序的查询条件
			jsonObject.put(DBConstant.SORT, DBConstant.DATE);
			// 并指定倒序作为查询条件
			jsonObject.put(DBConstant.SORT_ORDER, -1);
			// 放入userId作为查询条件
			subJsonObject.put(DBConstant.USER_ID_T, userId);
			// 把subJsonObject放入jsonObject
			jsonObject.put(DBConstant.USER, subJsonObject);
		} catch (JSONException e) {
			logger.warn("通过用户ID获取他所有的看房授权记录,拼接请求的JOSN数据出现异常！！！！");
		}
		// 把jsonObject转字符串
		String data = jsonObject.toString();
		// 向数据库微服务发请求
		String result = DBUtil.sendPost(DBConstant.DB_URI, DBConstant.DATA, data, DBConstant.UTF8);
		// 把请求结果返回给函数调用者
		return result;
	}

	/**
	 * 通过房间ID查找锁ID
	 * 
	 * @param roomId
	 *            房间ID
	 * @return 锁ID
	 */
	public static String getOpenLockIdByRoomId(String roomId) {
		// 返回的锁ID
		String openLockId = null;
		// 新建一个jsonObjec用于封装请求参数为json格式
		JSONObject jsonObject = new JSONObject();
		// 新建一个subJsonObject用于存放查找条件
		JSONObject subJsonObject = new JSONObject();
		try {
			// 指定数据库名
			jsonObject.put(DBConstant.DB_NAME, DBConstant.OPEN_LOCK_ID_DB);
			// 指定表名
			jsonObject.put(DBConstant.TAB_NAME, DBConstant.OPEN_LOCK_ID_TAB);
			// 指定查找方法
			jsonObject.put(DBConstant.METHOD, DBConstant.FIND);
			// 放入roomId作为查询条件
			subJsonObject.put(DBConstant.HOUSE_ID, roomId);
			// 把subJsonObject放入jsonObject
			jsonObject.put(DBConstant.DATA, subJsonObject);
			
		} catch (JSONException e) {
			logger.warn("getOpenLockIdByRoomId 在封装JSON格式请求参数时，出现异常！！！！！");
		}
		// 把jsonObject转字符串
		String data = jsonObject.toString();
		logger.info("getOpenLockIdByRoomId发送的请求数据是：{}", data);
		// 向数据库微服务发请求
		String result = DBUtil.sendPost(DBConstant.DB_URI, DBConstant.DATA, data, DBConstant.UTF8);
		logger.info("请求到的锁ID数据是：{}", result);
		if (result != null) {
			try {
				JSONArray jsonArray = new JSONArray(result);
				jsonObject = jsonArray.getJSONObject(0);
				openLockId = jsonObject.getString(DBConstant.LOCK_ID);
			} catch (JSONException e) {
				logger.warn("解析返回回来的锁信息JSON数据出现异常！！！！！");
			}
		} else {}
		return openLockId;
	}
	
	/**
	 * 根据roomId获取房间的看房记录信息
	 * 
	 * @param roomId
	 * @return JSONArray 或 null
	 */
	public static String getCheckRoomRecordById(String roomId) {
		// 新建一个jsonObjec用于封装请求参数为json格式
		JSONObject jsonObject = new JSONObject();
		// 新建一个subJsonObject用于存放查找条件
		JSONObject subJsonObject = new JSONObject();
		try {
			// 指定数据库名
			jsonObject.put(DBConstant.DB_NAME, DBConstant.CHECK_ROOM_RECORD_DB);
			// 指定表名
			jsonObject.put(DBConstant.TAB_NAME, DBConstant.CHECK_ROOM_RECORD_TAB);
			// 指定查找方法
			jsonObject.put(DBConstant.METHOD, DBConstant.FIND);
			// 放入roomId作为查询条件
			subJsonObject.put(DBConstant.ROOM_ID, roomId);
			// 把subJsonObject放入jsonObject
			jsonObject.put(DBConstant.DATA, subJsonObject);
			
		} catch (JSONException e) {
			logger.warn("getOpenLockIdByRoomId 在封装JSON格式请求参数时，出现异常！！！！！");
		}
		// 把jsonObject转字符串
		String data = jsonObject.toString();
		logger.info("getCheckRoomRecordById发送的请求数据是：{}", data);
		// 向数据库微服务发请求
		String result = DBUtil.sendPost(DBConstant.DB_URI, DBConstant.DATA, data, DBConstant.UTF8);
		logger.info("请求到的看房记录数据是：{}", result);
		try {
			JSONArray jsonArray = new JSONArray(result);
		} catch (JSONException e) {
			// 如果出现异常，就把 result置为null，以提示调用者
			result = null;
		}
		return result;
	}
	
	/**
	 * 更新指定的json数据到CheckRoomRecord表
	 * 
	 * @param jsonObject 封装好的json数据
	 * @return
	 */
	public static String updateCheckRoomRecord(JSONObject jsonObject) {
		String result = null;
		logger.info("updateCheckRoomRecord 收到的json格式数据是:{}", jsonObject);
		// 新建fatherJsonObject封装请求参数
		JSONObject fatherJsonObject = new JSONObject();
		try {
			// 指定数据库名
			fatherJsonObject.put(DBConstant.DB_NAME, DBConstant.CHECK_ROOM_RECORD_DB);
			// 指定表名
			fatherJsonObject.put(DBConstant.TAB_NAME, DBConstant.CHECK_ROOM_RECORD_TAB);
			// 指定方法名
			fatherJsonObject.put(DBConstant.METHOD, DBConstant.UPDATE);
			// 放入jsonObject
			fatherJsonObject.put(DBConstant.DATA, jsonObject);
		} catch (JSONException e) {
			logger.warn("updateCheckRoomRecord 构造数据出现异常！！！！");
		}
		// 调用数据库微服务
		result = DBUtil.sendPost(DBConstant.DB_URI, DBConstant.DATA, fatherJsonObject.toString(), DBConstant.UTF8);
		logger.info("updateCheckRoomRecord发送给数据库微服务的请求数据数：{}", fatherJsonObject.toString());
		return result;
	}
}
